using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace XnaDevRu.Bullet.Dynamics
{
	public abstract class TypedConstraint
	{
		private static RigidBody _fixed = new RigidBody(0, null, null, new Vector3(), 0, 0, 0.5f, 0);
		private int _userConstraintType;
		private int _userConstraintId;

		private RigidBody _rbA;
		private RigidBody _rbB;
		private float _appliedImpulse;

		public TypedConstraint()
			: this(_fixed, _fixed) { }

		public TypedConstraint(RigidBody rbA)
			: this(rbA, _fixed) { }

		public TypedConstraint(RigidBody rbA, RigidBody rbB)
		{
			_userConstraintType = -1;
			_userConstraintId = -1;
			_rbA = rbA;
			_rbB = rbB;
			_appliedImpulse = 0;

			_fixed.SetMassProps(0, new Vector3());
		}

		public virtual RigidBody RigidBodyA { get { return _rbA; } protected set { _rbA = value; } }
		public virtual RigidBody RigidBodyB { get { return _rbB; } protected set { _rbB = value; } }

		public float AppliedImpulse { get { return _appliedImpulse; } protected set { _appliedImpulse = value; } }
		public int UserConstraintId { get { return _userConstraintId; } set { _userConstraintId = value; } }
		public int UserConstraintType { get { return _userConstraintType; } set { _userConstraintType = value; } }

		public abstract void BuildJacobian();
		public abstract void SolveConstraint(float timeStep);
	}
}
